﻿\subsection{使能 \lstinline{A20} 地址线 }

在 x86 体系结构发展早期，像 8088 这样的处理器有 20 根地址线，访存时将段地址左移 4 位，此过程中高位移丢。
因此，在 8088 处理器上，当段地址的值过大时，由于只有 20 根地址线（\lstinline{A0 ~ A19}），内存地址会回绕到低地址处，这一特性被称作内存回绕（Memory Wraparound）。
但是，当地址线位数扩展后，访存时使用到这一特性的代码就无法保证正确运行，甚至会出现段错误（Segmentation Fault）。
为了保持对 16 位代码的兼容性，x86 给 20 号地址线 \lstinline{A20} 增加了开关。
进入 32 位保护模式后，地址空间需要扩大到 32 位，因此必须要先将 20 号地址线打开。

打开 \lstinline{A20} 地址线的方式有多种，较为简便的方法是使用 Fast \lstinline{A20} 方式（表 \ref{FAST_0x92}），通过 \lstinline{0x92} 端口的第 1 位控制 \lstinline{A20} 地址线的开关。

\begin{figure}[h!]
\captionsetup{type=table}
\caption{\lstinline{0x92} 端口 }\label{FAST_0x92}
\begin{minipage}{14cm}
    \Centering
    \begin{tabular}{|p{3cm}|>{\RaggedRight\arraybackslash}p{6cm}|}
        \hline
        \multicolumn{2}{|c|}{\Centering\textbf{\texttt{0x92} 端口 }}\\
        \hline
        \Centering\textbf{属性位}&\Centering\textbf{功能}\\
        \hline
        0（W）& 此位写入 1 进行快速重置（用于切换回实模式）\\
        \hline
        1（R/W）&0 --- 关闭 A20\quad{}1 --- 开启 A20\\
        \hline
        3（R/W?）& 是否允许访问开机密码。只有在此位为 0 时才可写入。\\
        \hline
        6, 7（R/W）& 控制硬盘活动灯（LED）的亮灭。00 关闭 LED，否则（01、10、11）开启。\\
        \hline
        2, 4, 5& 保留，不应使用。\\
        \hline
    \end{tabular}
\end{minipage}
\end{figure}

% \begin{minted}{nasm}
% Enable_A20:
%     in al, 0x92
%     test al, 0b0000_0010 ; 检测是否已经打开
%     jne AlreadyEnabled
%     or al, 0b0000_0010 ; 第一位置位
%     out 0x92, al ; 开启 A20 地址线
% AlreadyEnabled:
% \end{minted}
